package com.winkyle.woodenfish.util;

import android.content.Context;
import android.content.SharedPreferences;

/**
 * todo
 * @author winkyle
 * @date 2018/06/14
 * @description 一个用于存取本app缓存数据的类
 */

public class UserConfig {

    /**
     * 直接存取原始内存地址，不让程序轻易改变，用于存储本地数据
     */
    public volatile static UserConfig userConfig;

    /**
     * 跟存储数据有关的上下文
     */
    private Context context;

    /**
     * 存储当前登录账号和已登录账号的文件名
     */
    private String LoginAccountFile = "LoginAccountFile";

    /**
     * 存储登录账号列表对应的key
     */
    private String Cookie = "Cookie";

    /**
     * 存储DeviceToken对应的key
     */
    private String DeviceToken = "DeviceToken";

    /**
     * 是否第一次开锁对应的key
     */
    private String FirstOpenLock = "FirstOpenLock";

    /**
     * 存储登录账号列表对应的key
     */
    private String LoginAccountList = "LoginAccountList";

    /**
     * 存储登录账号用户信息的文件名
     */
    private String UserInfoFile = "UserInfoFile";

    /**
     * 存储apk一些信息的文件名
     */
    private String ApkFile = "ApkFile";

    /**
     * 存储上次打开apk时apk的versionName对应的key
     */
    private String VersionName = "VersionName";

    /**
     * 存储是否第一次使用App
     */
    private String FirstUse = "private";

    /**
     * 私有构造器，不让程序从外部实例化本类
     * @param context 上下文
     */
    private UserConfig(Context context) {
        this.context = context;
    }

    /**
     * 单例模式获取一个userConfig实例，单例模式下不让数据随意被篡改
     * @param context 上下文
     * @return 一个 {@link UserConfig} 实例，用来存储本地数据
     */
    public static UserConfig getInstance(Context context){
        if(userConfig == null){
            synchronized (UserConfig.class){
                if(userConfig == null)
                    userConfig = new UserConfig(context);
            }
        }
        if(userConfig.getContext()!=context) {
            userConfig.setContext(context);
        }
        return userConfig;
    }

    /**
     * 获取用来存数据的上下文
     * @return 一个 {@link Context} 实例，存数据的上下文
     */
    public Context getContext() {
        return context;
    }

    /**
     * 设置用来存数据的上下文
     * @param context 上下文
     */
    public void setContext(Context context) {
        this.context = context;
    }

    /**
     * 更新或存入当前登录账号
     * @param cookie 对应当前登录账号
     */
    public void setCookie(String cookie) {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(Cookie,cookie).apply();
    }

    /**
     * 获取当前登录账号
     * @return 一个 {@link String} 实例，描述当前登录账号
     */
    public String getCookie() {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(Cookie, null);
    }

    /**
     * 更新或存入已登录的登录账号列表
     * @param loginAccountList 已登录的登录账号列表,格式是json字符串
     */
    public void setLoginAccountList(String loginAccountList){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(LoginAccountList, loginAccountList).apply();
    }

    /**
     * 获取已登录的登录账号列表
     * @return 一个 {@link String} 实例，格式是json字符串，描述已登录的登录账号列表
     */
    public String getLoginAccountList(){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(LoginAccountList, null);
    }

    /**
     * 更新或存入登录账号的用户信息
     * @param cookie 对应登录账号
     * @param userinfo 登录账号的用户信息
     */
    public void setUserInfo(String cookie,String userinfo) {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                UserInfoFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(cookie, userinfo).apply();
    }

    /**
     * 获取登录账号存储的用户信息
     * @param cookie 对应登录账号
     * @return 一个 {@link String} 实例，格式是json字符串，描述登录账号的用户信息
     */
    public String getUserInfo(String cookie) {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                UserInfoFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(cookie, null);
    }

    /**
     * 删除登录账号存储的用户信息
     * @param cookie 对应登录账号
     */
    public void removeUserInfo(String cookie) {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                UserInfoFile, Context.MODE_PRIVATE);
        memberPrefs.edit().remove(cookie);
    }

    /**
     * 获取上次打开apk时apk的versionName
     * @return 一个 {@link String} 实例，描述上次打开apk时apk的versionName
     */
    public String getVersionName() {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                ApkFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(VersionName, null);
    }

    /**
     * 更新或存入打开apk时apk的versionName
     * @param versionName 打开apk时apk的versionName
     */
    public void setVersionName(String versionName) {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                ApkFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(VersionName, versionName).apply();
    }

    /**
     * 获取是否第一次使用app
     * @return 一个 {@link String} 实例，描述是否第一次使用app
     */
    public String getFirstUse() {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                ApkFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(FirstUse, null);
    }

    /**
     * 设置是否第一次使用app
     * @param firstUse 是否第一次使用app
     */
    public void setFirstUse(String firstUse) {
        SharedPreferences memberPrefs = context.getSharedPreferences(
                ApkFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(FirstUse, firstUse).apply();
    }

    public void setDeviceToken(String deviceToken){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(DeviceToken, deviceToken).apply();
    }

    public String getDeviceToken(){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(DeviceToken, null);
    }

    public void setFirstOpenLock(String firstOpenLock){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(FirstOpenLock, firstOpenLock).apply();
    }

    public String getFirstOpenLock(){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(FirstOpenLock, null);
    }

    /**
     * 存储DeviceToken对应的key
     */
    private String Phone = "Phone";

    public void setPhone(String phone){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        memberPrefs.edit().putString(Phone, phone).apply();
    }

    public String getPhone(){
        SharedPreferences memberPrefs = context.getSharedPreferences(
                LoginAccountFile, Context.MODE_PRIVATE);
        return memberPrefs.getString(Phone, null);
    }
}
